package cn.jbit.generatedbdata.generateData;

import cn.jbit.generatedbdata.GenerateAllData;
import cn.jbit.generatedbdata.tools.DBUtil;
import cn.jbit.generatedbdata.tools.StringUtil;


import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 * 向MySQL 库 rt_songdb 中 song 表生产数据
 */
public class GenerateRtSongdbSongTblData extends Thread {

    @Override
    public void run() {
        //测试线程代码
//        while(true){
//            try {
//                System.out.println("向song表中生产数据");
//                Thread.sleep(200);
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
//        }
        GenerateData();
    }

    private void GenerateData() {
        System.out.println("线程名: "+getName()+" 运行，开始向 rt_songdb库中的 song 表生产数据");
        Connection conn = null;
        String sql = null;
        List<Object[]> params = null;
        try {
            //1.获取数据库 rt_songdb 连接
            conn = DBUtil.getRTSongDBConnection();

            //2.先将表 song 数据清空
            DBUtil.deleteTblData(conn, "song");

            /**
             * 3.读取文件中的数据
             * 获取日志文件数据路径:
             * GenerateAllDBData.class.getClassLoader().getResource().getPath 获取的是编译后classes文件夹的根路径
             */
            InputStream in= GenerateAllData.class.getClassLoader().getResourceAsStream("rt_songdb_song_data.txt");
            BufferedReader br=new BufferedReader(new InputStreamReader(in));
            String line=br.readLine();

            //4.准备SQL语句
            sql = "INSERT INTO rt_songdb.song  VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";

            //5.准备列表，每满1000条数据就批量向MySQL对应表中插入数据
            params = new ArrayList<>();
            int flag = 0;
            while(line!=null){
                //解析每一行line
                String[] split = line.split("\\^");
                params.add(new Object[]{
                        StringUtil.strTrimStartAndEnd(split[0]),//source_id
                        StringUtil.strTrimStartAndEnd(split[1]),//name
                        StringUtil.strTrimStartAndEnd(split[2]),//other_name
                        StringUtil.convertStringtoInt(StringUtil.strTrimStartAndEnd(split[3])),//source
                        StringUtil.strTrimStartAndEnd(split[4]),//album
                        StringUtil.strTrimStartAndEnd(split[5]),//product
                        StringUtil.strTrimStartAndEnd(split[6]),//language
                        StringUtil.strTrimStartAndEnd(split[7]),//video_format
                        StringUtil.convertStringtoInt(StringUtil.strTrimStartAndEnd(split[8])),//duration
                        StringUtil.strTrimStartAndEnd(split[9]),//singer_info
                        StringUtil.strTrimStartAndEnd(split[10]),//post_time
                        StringUtil.strTrimStartAndEnd(split[11]),//pinyin_first
                        StringUtil.strTrimStartAndEnd(split[12]),//pinyin
                        StringUtil.convertStringtoInt(StringUtil.strTrimStartAndEnd(split[13])),//singing_type
                        StringUtil.strTrimStartAndEnd(split[14]),//original_singer
                        StringUtil.strTrimStartAndEnd(split[15]),//lyricist
                        StringUtil.strTrimStartAndEnd(split[16]),//composer
                        StringUtil.convertStringtoInt(StringUtil.strTrimStartAndEnd(split[17])),//bpm
                        StringUtil.convertStringtoInt(StringUtil.strTrimStartAndEnd(split[18])),//star_level
                        StringUtil.convertStringtoInt(StringUtil.strTrimStartAndEnd(split[19])),//video_quality
                        StringUtil.convertStringtoInt(StringUtil.strTrimStartAndEnd(split[20])),//video_make
                        StringUtil.convertStringtoInt(StringUtil.strTrimStartAndEnd(split[21])),//video_feature
                        StringUtil.convertStringtoInt(StringUtil.strTrimStartAndEnd(split[22])),//lyric_feature
                        StringUtil.convertStringtoInt(StringUtil.strTrimStartAndEnd(split[23])),//Image_quality
                        StringUtil.convertStringtoInt(StringUtil.strTrimStartAndEnd(split[24])),//subtitles_type
                        StringUtil.convertStringtoInt(StringUtil.strTrimStartAndEnd(split[25])),//audio_format
                        StringUtil.convertStringtoInt(StringUtil.strTrimStartAndEnd(split[26])),//original_sound_quality
                        StringUtil.convertStringtoInt(StringUtil.strTrimStartAndEnd(split[27])),//original_track
                        StringUtil.convertStringtoInt(StringUtil.strTrimStartAndEnd(split[28])),//original_track_vol
                        StringUtil.convertStringtoInt(StringUtil.strTrimStartAndEnd(split[29])),//accompany_version
                        StringUtil.convertStringtoInt(StringUtil.strTrimStartAndEnd(split[30])),//accompany_quality
                        StringUtil.convertStringtoInt(StringUtil.strTrimStartAndEnd(split[31])),//acc_track_vol
                        StringUtil.convertStringtoInt(StringUtil.strTrimStartAndEnd(split[32])),//accompany_track
                        StringUtil.convertStringtoInt(StringUtil.strTrimStartAndEnd(split[33])),//width
                        StringUtil.convertStringtoInt(StringUtil.strTrimStartAndEnd(split[34])),//height
                        StringUtil.convertStringtoInt(StringUtil.strTrimStartAndEnd(split[35])),//video_resolution
                        StringUtil.convertStringtoInt(StringUtil.strTrimStartAndEnd(split[36])),//song_version
                        StringUtil.strTrimStartAndEnd(split[37]),//authorized_company
                        StringUtil.convertStringtoInt(StringUtil.strTrimStartAndEnd(split[38])),//status
                        StringUtil.strTrimStartAndEnd(split[39])//publish_to
                });
                flag++;
                if(flag == 2000){
                    //3.向表song 中生产数据
                    DBUtil.executeBatch(conn, sql, params);
                    //清空计数与集合
                    flag = 0;
                    params.clear();
                    System.out.println("插入一批次 --- 2000行");

                }

                line=br.readLine();
            }

        } catch (Exception e) {
            e.printStackTrace();
        }finally {

            try {//将最后剩余不够1000条的数据插入到数据库表中
                DBUtil.executeBatch(conn, sql, params);
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            System.out.println("线程名: "+getName()+" 运行，向 rt_songdb库中的 song 表生产数据完成");
        }
    }
}
